#ifndef _sdl_texdata_h_
#define _sdl_texdata_h_

#include "sdl_my_opengl.h"
#include "gl_supported.h"
#include "sdl_exceptions.h"
#include "sdl_resource.h"
#include "SDL.h"
#include "SDL_image.h"
#include "sdl_prim.h"
#include "sdl_debug.h"
#include <iostream>
#include <string>
#include <cstdlib>
#include <list>
#include <fstream>

#include "boost/filesystem.hpp"

/**
 * \brief prototyp danych tekstury
 */

struct sdl_base_texdata : public sdl_prim,
depends<sdl_debug::debug> {
    ///czy data zawiera dane?
    bool inram;
    ///czy tekstura jest zaalokowana?
    bool invideo;
    ///texture handle
    GLuint texture;
    virtual void load();
    ///czy wszystko w porządku

    bool valid() {
        return invideo && inram;
    }
    sdl_base_texdata(const std::string & n);
    virtual ~sdl_base_texdata();
};

/**
 * \brief dane pojedynczej tekstury
 */

struct sdl_texdata : public sdl_base_texdata {

    typedef enum {
        direct, mipmap
    } texture_type;
    ///typ tekstury (zwykła czy mipmap)
    texture_type textype;
    ///zasób
    sdl_resource file;
    ///właściwe dane
    SDL_Surface * data;
    /**
     * \brief ładuje do pamięci RAM (ale nie do wideo!)
     *
     * Do wideo ładuje renderer.
     */
    sdl_texdata(const std::string & _file, texture_type t = mipmap, const std::string & n = "texture: ");
    virtual ~sdl_texdata();

private:
    void sub_load();

public:
    ///załaduj do pamięci wideo, jeżeli trzeba to z dysku, wywoływane automatycznie przez renderer
    void load();
    ///wyładuj z pamięci wideo, ale zostaw w RAM
    void unload();
    ///wyładuj z pamięci wideo i z RAM
    void strong_unload();
    ///wyładuj z RAM, zostaw w wideo
    void ram_unload();
    ///załaduj tylko do RAM
    void ram_load();
};

struct sdl_mipmap_data {
    SDL_Surface * data;
    int level;
    int max;
    sdl_mipmap_data();
    sdl_mipmap_data(const sdl_mipmap_data & s);
    void free();
};

/**
 * \brief mipmapa zbudowana z oddzielnych obrazów w jednym katalogu
 *
 * katalog zawiera plik konfiguracyjny mipmap.cfg
 * składnia:
 *
 * base rozdzielczość_podstawowa
 * texture poziom_od poziom_do plik1.png
 * texture poziom_od poziom_do plik2.png
 */

struct sdl_custom_mipmap_texdata : public sdl_base_texdata {
    ///rozdzielczość pierwotnego obrazu
    int base_res;
    ///katalog mipmap
    fs::path dir;
    ///właściwe dane
    std::list<sdl_mipmap_data> data;
    sdl_custom_mipmap_texdata(std::string d, const std::string & n = "custom mipmap: ");
    virtual ~sdl_custom_mipmap_texdata();
    void load();
};


#endif //_sdl_texdata_h_

